using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace linker.libs.winapis;

public static class User32
{
    #region Constants
    public const int CURSOR_SHOWING = 0x00000001;
    public const Int32 DI_NORMAL = 0x0003;

    public const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
    public const int MOUSEEVENTF_LEFTDOWN = 0x02;
    public const int MOUSEEVENTF_LEFTUP = 0x04;
    public const int MOUSEEVENTF_RIGHTDOWN = 0x08;
    public const int MOUSEEVENTF_RIGHTUP = 0x10;
    public const int MOUSEEVENTF_MOVE = 0x0001;
    public const int KEYEVENTF_KEYDOWN = 0x0000;
    public const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
    public const uint KEYEVENTF_KEYUP = 0x0002;

    public const int SPIF_SENDWININICHANGE = 0x02;
    public const int SPI_SETDESKWALLPAPER = 20;
    public const int SPIF_UPDATEINIFILE = 1;
    public const int SPIF_SENDCHANGE = 2;

    public static readonly int SPI_GETDESKWALLPAPER = 0x73;
    public static readonly int MAX_PATH = 260;
    #endregion

    #region Enums
    [Flags]
    public enum MouseEventFlags : uint
    {
        MOVE = 0x0001,

        LEFTDOWN = 0x0002,
        LEFTUP = 0x0004,

        RIGHTDOWN = 0x0008,
        RIGHTUP = 0x0010,

        MIDDLEDOWN = 0x0020,
        MIDDLEUP = 0x0040,

        XDOWN = 0x0080,
        XUP = 0x0100,

        VIRTUALDESK = 0x4000,
        ABSOLUTE = 0x8000,

        WHEEL = 0x0800,
        HWHEEL = 0x1000,

    }
    [Flags]
    public enum MOUSEEVENTF : uint
    {
        ABSOLUTE = 0x8000,
        HWHEEL = 0x01000,
        MOVE = 0x0001,
        MOVE_NOCOALESCE = 0x2000,
        LEFTDOWN = 0x0002,
        LEFTUP = 0x0004,
        RIGHTDOWN = 0x0008,
        RIGHTUP = 0x0010,
        MIDDLEDOWN = 0x0020,
        MIDDLEUP = 0x0040,
        VIRTUALDESK = 0x4000,
        WHEEL = 0x0800,
        XDOWN = 0x0080,
        XUP = 0x0100
    }
    public enum MonitorState
    {
        MonitorStateOn = -1,
        MonitorStateOff = 2,
        MonitorStateStandBy = 1
    }
    [Flags]
    public enum KEYEVENTF : uint
    {
        EXTENDEDKEY = 0x0001,
        KEYUP = 0x0002,
        SCANCODE = 0x0008,
        UNICODE = 0x0004
    }

    public enum VirtualKey : short
    {
        ///<summary>
                ///Left mouse button
                ///</summary>
        LBUTTON = 0x01,
        ///<summary>
                ///Right mouse button
                ///</summary>
        RBUTTON = 0x02,
        ///<summary>
                ///Control-break processing
                ///</summary>
        CANCEL = 0x03,
        ///<summary>
                ///Middle mouse button (three-button mouse)
                ///</summary>
        MBUTTON = 0x04,
        ///<summary>
                ///Windows 2000/XP: X1 mouse button
                ///</summary>
        XBUTTON1 = 0x05,
        ///<summary>
                ///Windows 2000/XP: X2 mouse button
                ///</summary>
        XBUTTON2 = 0x06,
        ///<summary>
                ///BACKSPACE key
                ///</summary>
        BACK = 0x08,
        ///<summary>
                ///TAB key
                ///</summary>
        TAB = 0x09,
        ///<summary>
                ///CLEAR key
                ///</summary>
        CLEAR = 0x0C,
        ///<summary>
                ///ENTER key
                ///</summary>
        RETURN = 0x0D,
        ///<summary>
                ///SHIFT key
                ///</summary>
        SHIFT = 0x10,
        ///<summary>
                ///CTRL key
                ///</summary>
        CONTROL = 0x11,
        ///<summary>
                ///ALT key
                ///</summary>
        MENU = 0x12,
        ///<summary>
                ///PAUSE key
                ///</summary>
        PAUSE = 0x13,
        ///<summary>
                ///CAPS LOCK key
                ///</summary>
        CAPITAL = 0x14,
        ///<summary>
                ///Input Method Editor (IME) Kana mode
                ///</summary>
        KANA = 0x15,
        ///<summary>
                ///IME Hangul mode
                ///</summary>
        HANGUL = 0x15,
        ///<summary>
                ///IME Junja mode
                ///</summary>
        JUNJA = 0x17,
        ///<summary>
                ///IME final mode
                ///</summary>
        FINAL = 0x18,
        ///<summary>
                ///IME Hanja mode
                ///</summary>
        HANJA = 0x19,
        ///<summary>
                ///IME Kanji mode
                ///</summary>
        KANJI = 0x19,
        ///<summary>
                ///ESC key
                ///</summary>
        ESCAPE = 0x1B,
        ///<summary>
                ///IME convert
                ///</summary>
        CONVERT = 0x1C,
        ///<summary>
                ///IME nonconvert
                ///</summary>
        NONCONVERT = 0x1D,
        ///<summary>
                ///IME accept
                ///</summary>
        ACCEPT = 0x1E,
        ///<summary>
                ///IME mode change request
                ///</summary>
        MODECHANGE = 0x1F,
        ///<summary>
                ///SPACEBAR
                ///</summary>
        SPACE = 0x20,
        ///<summary>
                ///PAGE UP key
                ///</summary>
        PRIOR = 0x21,
        ///<summary>
                ///PAGE DOWN key
                ///</summary>
        NEXT = 0x22,
        ///<summary>
                ///END key
                ///</summary>
        END = 0x23,
        ///<summary>
                ///HOME key
                ///</summary>
        HOME = 0x24,
        ///<summary>
                ///LEFT ARROW key
                ///</summary>
        LEFT = 0x25,
        ///<summary>
                ///UP ARROW key
                ///</summary>
        UP = 0x26,
        ///<summary>
                ///RIGHT ARROW key
                ///</summary>
        RIGHT = 0x27,
        ///<summary>
                ///DOWN ARROW key
                ///</summary>
        DOWN = 0x28,
        ///<summary>
                ///SELECT key
                ///</summary>
        SELECT = 0x29,
        ///<summary>
                ///PRINT key
                ///</summary>
        PRINT = 0x2A,
        ///<summary>
                ///EXECUTE key
                ///</summary>
        EXECUTE = 0x2B,
        ///<summary>
                ///PRINT SCREEN key
                ///</summary>
        SNAPSHOT = 0x2C,
        ///<summary>
                ///INS key
                ///</summary>
        INSERT = 0x2D,
        ///<summary>
                ///DEL key
                ///</summary>
        DELETE = 0x2E,
        ///<summary>
                ///HELP key
                ///</summary>
        HELP = 0x2F,
        ///<summary>
                ///0 key
                ///</summary>
        KEY_0 = 0x30,
        ///<summary>
                ///1 key
                ///</summary>
        KEY_1 = 0x31,
        ///<summary>
                ///2 key
                ///</summary>
        KEY_2 = 0x32,
        ///<summary>
                ///3 key
                ///</summary>
        KEY_3 = 0x33,
        ///<summary>
                ///4 key
                ///</summary>
        KEY_4 = 0x34,
        ///<summary>
                ///5 key
                ///</summary>
        KEY_5 = 0x35,
        ///<summary>
                ///6 key
                ///</summary>
        KEY_6 = 0x36,
        ///<summary>
                ///7 key
                ///</summary>
        KEY_7 = 0x37,
        ///<summary>
                ///8 key
                ///</summary>
        KEY_8 = 0x38,
        ///<summary>
                ///9 key
                ///</summary>
        KEY_9 = 0x39,
        ///<summary>
                ///A key
                ///</summary>
        KEY_A = 0x41,
        ///<summary>
                ///B key
                ///</summary>
        KEY_B = 0x42,
        ///<summary>
                ///C key
                ///</summary>
        KEY_C = 0x43,
        ///<summary>
                ///D key
                ///</summary>
        KEY_D = 0x44,
        ///<summary>
                ///E key
                ///</summary>
        KEY_E = 0x45,
        ///<summary>
                ///F key
                ///</summary>
        KEY_F = 0x46,
        ///<summary>
                ///G key
                ///</summary>
        KEY_G = 0x47,
        ///<summary>
                ///H key
                ///</summary>
        KEY_H = 0x48,
        ///<summary>
                ///I key
                ///</summary>
        KEY_I = 0x49,
        ///<summary>
                ///J key
                ///</summary>
        KEY_J = 0x4A,
        ///<summary>
                ///K key
                ///</summary>
        KEY_K = 0x4B,
        ///<summary>
                ///L key
                ///</summary>
        KEY_L = 0x4C,
        ///<summary>
                ///M key
                ///</summary>
        KEY_M = 0x4D,
        ///<summary>
                ///N key
                ///</summary>
        KEY_N = 0x4E,
        ///<summary>
                ///O key
                ///</summary>
        KEY_O = 0x4F,
        ///<summary>
                ///P key
                ///</summary>
        KEY_P = 0x50,
        ///<summary>
                ///Q key
                ///</summary>
        KEY_Q = 0x51,
        ///<summary>
                ///R key
                ///</summary>
        KEY_R = 0x52,
        ///<summary>
                ///S key
                ///</summary>
        KEY_S = 0x53,
        ///<summary>
                ///T key
                ///</summary>
        KEY_T = 0x54,
        ///<summary>
                ///U key
                ///</summary>
        KEY_U = 0x55,
        ///<summary>
                ///V key
                ///</summary>
        KEY_V = 0x56,
        ///<summary>
                ///W key
                ///</summary>
        KEY_W = 0x57,
        ///<summary>
                ///X key
                ///</summary>
        KEY_X = 0x58,
        ///<summary>
                ///Y key
                ///</summary>
        KEY_Y = 0x59,
        ///<summary>
                ///Z key
                ///</summary>
        KEY_Z = 0x5A,
        ///<summary>
                ///Left Windows key (Microsoft Natural keyboard) 
                ///</summary>
        LWIN = 0x5B,
        ///<summary>
                ///Right Windows key (Natural keyboard)
                ///</summary>
        RWIN = 0x5C,
        ///<summary>
                ///Applications key (Natural keyboard)
                ///</summary>
        APPS = 0x5D,
        ///<summary>
                ///Computer Sleep key
                ///</summary>
        SLEEP = 0x5F,
        ///<summary>
                ///Numeric keypad 0 key
                ///</summary>
        NUMPAD0 = 0x60,
        ///<summary>
                ///Numeric keypad 1 key
                ///</summary>
        NUMPAD1 = 0x61,
        ///<summary>
                ///Numeric keypad 2 key
                ///</summary>
        NUMPAD2 = 0x62,
        ///<summary>
                ///Numeric keypad 3 key
                ///</summary>
        NUMPAD3 = 0x63,
        ///<summary>
                ///Numeric keypad 4 key
                ///</summary>
        NUMPAD4 = 0x64,
        ///<summary>
                ///Numeric keypad 5 key
                ///</summary>
        NUMPAD5 = 0x65,
        ///<summary>
                ///Numeric keypad 6 key
                ///</summary>
        NUMPAD6 = 0x66,
        ///<summary>
                ///Numeric keypad 7 key
                ///</summary>
        NUMPAD7 = 0x67,
        ///<summary>
                ///Numeric keypad 8 key
                ///</summary>
        NUMPAD8 = 0x68,
        ///<summary>
                ///Numeric keypad 9 key
                ///</summary>
        NUMPAD9 = 0x69,
        ///<summary>
                ///Multiply key
                ///</summary>
        MULTIPLY = 0x6A,
        ///<summary>
                ///Add key
                ///</summary>
        ADD = 0x6B,
        ///<summary>
                ///Separator key
                ///</summary>
        SEPARATOR = 0x6C,
        ///<summary>
                ///Subtract key
                ///</summary>
        SUBTRACT = 0x6D,
        ///<summary>
                ///Decimal key
                ///</summary>
        DECIMAL = 0x6E,
        ///<summary>
                ///Divide key
                ///</summary>
        DIVIDE = 0x6F,
        ///<summary>
                ///F1 key
                ///</summary>
        F1 = 0x70,
        ///<summary>
                ///F2 key
                ///</summary>
        F2 = 0x71,
        ///<summary>
                ///F3 key
                ///</summary>
        F3 = 0x72,
        ///<summary>
                ///F4 key
                ///</summary>
        F4 = 0x73,
        ///<summary>
                ///F5 key
                ///</summary>
        F5 = 0x74,
        ///<summary>
                ///F6 key
                ///</summary>
        F6 = 0x75,
        ///<summary>
                ///F7 key
                ///</summary>
        F7 = 0x76,
        ///<summary>
                ///F8 key
                ///</summary>
        F8 = 0x77,
        ///<summary>
                ///F9 key
                ///</summary>
        F9 = 0x78,
        ///<summary>
                ///F10 key
                ///</summary>
        F10 = 0x79,
        ///<summary>
                ///F11 key
                ///</summary>
        F11 = 0x7A,
        ///<summary>
                ///F12 key
                ///</summary>
        F12 = 0x7B,
        ///<summary>
                ///F13 key
                ///</summary>
        F13 = 0x7C,
        ///<summary>
                ///F14 key
                ///</summary>
        F14 = 0x7D,
        ///<summary>
                ///F15 key
                ///</summary>
        F15 = 0x7E,
        ///<summary>
                ///F16 key
                ///</summary>
        F16 = 0x7F,
        ///<summary>
                ///F17 key  
                ///</summary>
        F17 = 0x80,
        ///<summary>
                ///F18 key  
                ///</summary>
        F18 = 0x81,
        ///<summary>
                ///F19 key  
                ///</summary>
        F19 = 0x82,
        ///<summary>
                ///F20 key  
                ///</summary>
        F20 = 0x83,
        ///<summary>
                ///F21 key  
                ///</summary>
        F21 = 0x84,
        ///<summary>
                ///F22 key, (PPC only) Key used to lock device.
                ///</summary>
        F22 = 0x85,
        ///<summary>
                ///F23 key  
                ///</summary>
        F23 = 0x86,
        ///<summary>
                ///F24 key  
                ///</summary>
        F24 = 0x87,
        ///<summary>
                ///NUM LOCK key
                ///</summary>
        NUMLOCK = 0x90,
        ///<summary>
                ///SCROLL LOCK key
                ///</summary>
        SCROLL = 0x91,
        ///<summary>
                ///Left SHIFT key
                ///</summary>
        LSHIFT = 0xA0,
        ///<summary>
                ///Right SHIFT key
                ///</summary>
        RSHIFT = 0xA1,
        ///<summary>
                ///Left CONTROL key
                ///</summary>
        LCONTROL = 0xA2,
        ///<summary>
                ///Right CONTROL key
                ///</summary>
        RCONTROL = 0xA3,
        ///<summary>
                ///Left MENU key
                ///</summary>
        LMENU = 0xA4,
        ///<summary>
                ///Right MENU key
                ///</summary>
        RMENU = 0xA5,
        ///<summary>
                ///Windows 2000/XP: Browser Back key
                ///</summary>
        BROWSER_BACK = 0xA6,
        ///<summary>
                ///Windows 2000/XP: Browser Forward key
                ///</summary>
        BROWSER_FORWARD = 0xA7,
        ///<summary>
                ///Windows 2000/XP: Browser Refresh key
                ///</summary>
        BROWSER_REFRESH = 0xA8,
        ///<summary>
                ///Windows 2000/XP: Browser Stop key
                ///</summary>
        BROWSER_STOP = 0xA9,
        ///<summary>
                ///Windows 2000/XP: Browser Search key 
                ///</summary>
        BROWSER_SEARCH = 0xAA,
        ///<summary>
                ///Windows 2000/XP: Browser Favorites key
                ///</summary>
        BROWSER_FAVORITES = 0xAB,
        ///<summary>
                ///Windows 2000/XP: Browser Start and Home key
                ///</summary>
        BROWSER_HOME = 0xAC,
        ///<summary>
                ///Windows 2000/XP: Volume Mute key
                ///</summary>
        VOLUME_MUTE = 0xAD,
        ///<summary>
                ///Windows 2000/XP: Volume Down key
                ///</summary>
        VOLUME_DOWN = 0xAE,
        ///<summary>
                ///Windows 2000/XP: Volume Up key
                ///</summary>
        VOLUME_UP = 0xAF,
        ///<summary>
                ///Windows 2000/XP: Next Track key
                ///</summary>
        MEDIA_NEXT_TRACK = 0xB0,
        ///<summary>
                ///Windows 2000/XP: Previous Track key
                ///</summary>
        MEDIA_PREV_TRACK = 0xB1,
        ///<summary>
                ///Windows 2000/XP: Stop Media key
                ///</summary>
        MEDIA_STOP = 0xB2,
        ///<summary>
                ///Windows 2000/XP: Play/Pause Media key
                ///</summary>
        MEDIA_PLAY_PAUSE = 0xB3,
        ///<summary>
                ///Windows 2000/XP: Start Mail key
                ///</summary>
        LAUNCH_MAIL = 0xB4,
        ///<summary>
                ///Windows 2000/XP: Select Media key
                ///</summary>
        LAUNCH_MEDIA_SELECT = 0xB5,
        ///<summary>
                ///Windows 2000/XP: Start Application 1 key
                ///</summary>
        LAUNCH_APP1 = 0xB6,
        ///<summary>
                ///Windows 2000/XP: Start Application 2 key
                ///</summary>
        LAUNCH_APP2 = 0xB7,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard.
                ///</summary>
        OEM_1 = 0xBA,
        ///<summary>
                ///Windows 2000/XP: For any country/region, the '+' key
                ///</summary>
        OEM_PLUS = 0xBB,
        ///<summary>
                ///Windows 2000/XP: For any country/region, the ',' key
                ///</summary>
        OEM_COMMA = 0xBC,
        ///<summary>
                ///Windows 2000/XP: For any country/region, the '-' key
                ///</summary>
        OEM_MINUS = 0xBD,
        ///<summary>
                ///Windows 2000/XP: For any country/region, the '.' key
                ///</summary>
        OEM_PERIOD = 0xBE,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard.
                ///</summary>
        OEM_2 = 0xBF,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard. 
                ///</summary>
        OEM_3 = 0xC0,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard. 
                ///</summary>
        OEM_4 = 0xDB,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard. 
                ///</summary>
        OEM_5 = 0xDC,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard. 
                ///</summary>
        OEM_6 = 0xDD,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard. 
                ///</summary>
        OEM_7 = 0xDE,
        ///<summary>
                ///Used for miscellaneous characters; it can vary by keyboard.
                ///</summary>
        OEM_8 = 0xDF,
        ///<summary>
                ///Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard
                ///</summary>
        OEM_102 = 0xE2,
        ///<summary>
                ///Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key
                ///</summary>
        PROCESSKEY = 0xE5,
        ///<summary>
                ///Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes.
                ///The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information,
                ///see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
                ///</summary>
        PACKET = 0xE7,
        ///<summary>
                ///Attn key
                ///</summary>
        ATTN = 0xF6,
        ///<summary>
                ///CrSel key
                ///</summary>
        CRSEL = 0xF7,
        ///<summary>
                ///ExSel key
                ///</summary>
        EXSEL = 0xF8,
        ///<summary>
                ///Erase EOF key
                ///</summary>
        EREOF = 0xF9,
        ///<summary>
                ///Play key
                ///</summary>
        PLAY = 0xFA,
        ///<summary>
                ///Zoom key
                ///</summary>
        ZOOM = 0xFB,
        ///<summary>
                ///Reserved 
                ///</summary>
        NONAME = 0xFC,
        ///<summary>
                ///PA1 key
                ///</summary>
        PA1 = 0xFD,
        ///<summary>
                ///Clear key
                ///</summary>
        OEM_CLEAR = 0xFE
    }
    public enum ScanCodeShort : short
    {
        LBUTTON = 0,
        RBUTTON = 0,
        CANCEL = 70,
        MBUTTON = 0,
        XBUTTON1 = 0,
        XBUTTON2 = 0,
        BACK = 14,
        TAB = 15,
        CLEAR = 76,
        RETURN = 28,
        SHIFT = 42,
        CONTROL = 29,
        MENU = 56,
        PAUSE = 0,
        CAPITAL = 58,
        KANA = 0,
        HANGUL = 0,
        JUNJA = 0,
        FINAL = 0,
        HANJA = 0,
        KANJI = 0,
        ESCAPE = 1,
        CONVERT = 0,
        NONCONVERT = 0,
        ACCEPT = 0,
        MODECHANGE = 0,
        SPACE = 57,
        PRIOR = 73,
        NEXT = 81,
        END = 79,
        HOME = 71,
        LEFT = 75,
        UP = 72,
        RIGHT = 77,
        DOWN = 80,
        SELECT = 0,
        PRINT = 0,
        EXECUTE = 0,
        SNAPSHOT = 84,
        INSERT = 82,
        DELETE = 83,
        HELP = 99,
        KEY_0 = 11,
        KEY_1 = 2,
        KEY_2 = 3,
        KEY_3 = 4,
        KEY_4 = 5,
        KEY_5 = 6,
        KEY_6 = 7,
        KEY_7 = 8,
        KEY_8 = 9,
        KEY_9 = 10,
        KEY_A = 30,
        KEY_B = 48,
        KEY_C = 46,
        KEY_D = 32,
        KEY_E = 18,
        KEY_F = 33,
        KEY_G = 34,
        KEY_H = 35,
        KEY_I = 23,
        KEY_J = 36,
        KEY_K = 37,
        KEY_L = 38,
        KEY_M = 50,
        KEY_N = 49,
        KEY_O = 24,
        KEY_P = 25,
        KEY_Q = 16,
        KEY_R = 19,
        KEY_S = 31,
        KEY_T = 20,
        KEY_U = 22,
        KEY_V = 47,
        KEY_W = 17,
        KEY_X = 45,
        KEY_Y = 21,
        KEY_Z = 44,
        LWIN = 91,
        RWIN = 92,
        APPS = 93,
        SLEEP = 95,
        NUMPAD0 = 82,
        NUMPAD1 = 79,
        NUMPAD2 = 80,
        NUMPAD3 = 81,
        NUMPAD4 = 75,
        NUMPAD5 = 76,
        NUMPAD6 = 77,
        NUMPAD7 = 71,
        NUMPAD8 = 72,
        NUMPAD9 = 73,
        MULTIPLY = 55,
        ADD = 78,
        SEPARATOR = 0,
        SUBTRACT = 74,
        DECIMAL = 83,
        DIVIDE = 53,
        F1 = 59,
        F2 = 60,
        F3 = 61,
        F4 = 62,
        F5 = 63,
        F6 = 64,
        F7 = 65,
        F8 = 66,
        F9 = 67,
        F10 = 68,
        F11 = 87,
        F12 = 88,
        F13 = 100,
        F14 = 101,
        F15 = 102,
        F16 = 103,
        F17 = 104,
        F18 = 105,
        F19 = 106,
        F20 = 107,
        F21 = 108,
        F22 = 109,
        F23 = 110,
        F24 = 118,
        NUMLOCK = 69,
        SCROLL = 70,
        LSHIFT = 42,
        RSHIFT = 54,
        LCONTROL = 29,
        RCONTROL = 29,
        LMENU = 56,
        RMENU = 56,
        BROWSER_BACK = 106,
        BROWSER_FORWARD = 105,
        BROWSER_REFRESH = 103,
        BROWSER_STOP = 104,
        BROWSER_SEARCH = 101,
        BROWSER_FAVORITES = 102,
        BROWSER_HOME = 50,
        VOLUME_MUTE = 32,
        VOLUME_DOWN = 46,
        VOLUME_UP = 48,
        MEDIA_NEXT_TRACK = 25,
        MEDIA_PREV_TRACK = 16,
        MEDIA_STOP = 36,
        MEDIA_PLAY_PAUSE = 34,
        LAUNCH_MAIL = 108,
        LAUNCH_MEDIA_SELECT = 109,
        LAUNCH_APP1 = 107,
        LAUNCH_APP2 = 33,
        OEM_1 = 39,
        OEM_PLUS = 13,
        OEM_COMMA = 51,
        OEM_MINUS = 12,
        OEM_PERIOD = 52,
        OEM_2 = 53,
        OEM_3 = 41,
        OEM_4 = 26,
        OEM_5 = 43,
        OEM_6 = 27,
        OEM_7 = 40,
        OEM_8 = 0,
        OEM_102 = 86,
        PROCESSKEY = 0,
        PACKET = 0,
        ATTN = 0,
        CRSEL = 0,
        EXSEL = 0,
        EREOF = 93,
        PLAY = 0,
        ZOOM = 98,
        NONAME = 0,
        PA1 = 0,
        OEM_CLEAR = 0,
    }
    [Flags]
    public enum ACCESS_MASK : uint
    {
        DELETE = 0x00010000,
        READ_CONTROL = 0x00020000,
        WRITE_DAC = 0x00040000,
        WRITE_OWNER = 0x00080000,
        SYNCHRONIZE = 0x00100000,

        STANDARD_RIGHTS_REQUIRED = 0x000F0000,

        STANDARD_RIGHTS_READ = 0x00020000,
        STANDARD_RIGHTS_WRITE = 0x00020000,
        STANDARD_RIGHTS_EXECUTE = 0x00020000,

        STANDARD_RIGHTS_ALL = 0x001F0000,

        SPECIFIC_RIGHTS_ALL = 0x0000FFFF,

        ACCESS_SYSTEM_SECURITY = 0x01000000,

        MAXIMUM_ALLOWED = 0x02000000,

        GENERIC_READ = 0x80000000,
        GENERIC_WRITE = 0x40000000,
        GENERIC_EXECUTE = 0x20000000,
        GENERIC_ALL = 0x10000000,

        DESKTOP_READOBJECTS = 0x00000001,
        DESKTOP_CREATEWINDOW = 0x00000002,
        DESKTOP_CREATEMENU = 0x00000004,
        DESKTOP_HOOKCONTROL = 0x00000008,
        DESKTOP_JOURNALRECORD = 0x00000010,
        DESKTOP_JOURNALPLAYBACK = 0x00000020,
        DESKTOP_ENUMERATE = 0x00000040,
        DESKTOP_WRITEOBJECTS = 0x00000080,
        DESKTOP_SWITCHDESKTOP = 0x00000100,

        WINSTA_ENUMDESKTOPS = 0x00000001,
        WINSTA_READATTRIBUTES = 0x00000002,
        WINSTA_ACCESSCLIPBOARD = 0x00000004,
        WINSTA_CREATEDESKTOP = 0x00000008,
        WINSTA_WRITEATTRIBUTES = 0x00000010,
        WINSTA_ACCESSGLOBALATOMS = 0x00000020,
        WINSTA_EXITWINDOWS = 0x00000040,
        WINSTA_ENUMERATE = 0x00000100,
        WINSTA_READSCREEN = 0x00000200,

        WINSTA_ALL_ACCESS = 0x0000037F
    }
    public enum InputType : uint
    {
        MOUSE = 0,
        KEYBOARD = 1,
        HARDWARE = 2
    }
    public enum MessageBoxType : long
    {
        MB_ABORTRETRYIGNORE = 0x00000002L,
        MB_CANCELTRYCONTINUE = 0x00000006L,
        MB_HELP = 0x00004000L,
        MB_OK = 0x00000000L,
        MB_OKCANCEL = 0x00000001L,
        MB_RETRYCANCEL = 0x00000005L,
        MB_YESNO = 0x00000004L,
        MB_YESNOCANCEL = 0x00000003L,
        MB_ICONEXCLAMATION = 0x00000030L,
        MB_ICONWARNING = 0x00000030L,
        MB_ICONINFORMATION = 0x00000040L,
        MB_ICONASTERISK = 0x00000040L,
        MB_ICONQUESTION = 0x00000020L,
        MB_ICONSTOP = 0x00000010L,
        MB_ICONERROR = 0x00000010L,
        MB_ICONHAND = 0x00000010L,
        MB_DEFBUTTON1 = 0x00000000L,
        MB_DEFBUTTON2 = 0x00000100L,
        MB_DEFBUTTON3 = 0x00000200L,
        MB_DEFBUTTON4 = 0x00000300L,
        MB_APPLMODAL = 0x00000000L,
        MB_SYSTEMMODAL = 0x00001000L,
        MB_TASKMODAL = 0x00002000L,
        MB_DEFAULT_DESKTOP_ONLY = 0x00020000L,
        MB_RIGHT = 0x00080000L,
        MB_RTLREADING = 0x00100000L,
        MB_SETFOREGROUND = 0x00010000L,
        MB_TOPMOST = 0x00040000L,
        MB_SERVICE_NOTIFICATION = 0x00200000L
    }

    public enum MessageBoxResult : int
    {
        IDABORT = 3,
        IDCANCEL = 2,
        IDCONTINUE = 11,
        IDIGNORE = 5,
        IDNO = 7,
        IDOK = 1,
        IDRETRY = 4,
        IDTRYAGAIN = 10,
        IDYES = 6,
    }
    public enum SW
    {
        SW_HIDE = 0,
        SW_SHOWNORMAL = 1,
        SW_NORMAL = 1,
        SW_SHOWMINIMIZED = 2,
        SW_SHOWMAXIMIZED = 3,
        SW_MAXIMIZE = 3,
        SW_SHOWNOACTIVATE = 4,
        SW_SHOW = 5,
        SW_MINIMIZE = 6,
        SW_SHOWMINNOACTIVE = 7,
        SW_SHOWNA = 8,
        SW_RESTORE = 9,
        SW_SHOWDEFAULT = 10,
        SW_MAX = 10
    }
    public enum VkMapType : uint
    {
        MAPVK_VK_TO_VSC = 0,
        MAPVK_VSC_TO_VK = 1,
        MAPVK_VK_TO_CHAR = 2,
        MAPVK_VSC_TO_VK_EX = 3,
        MAPVK_VK_TO_VSC_EX = 4
    }

    #endregion

    #region Structs
    [StructLayout(LayoutKind.Sequential)]
    public struct ICONINFO
    {
        public bool fIcon;
        public int xHotspot;
        public int yHotspot;
        public nint hbmMask;
        public nint hbmColor;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;
    }


    [StructLayout(LayoutKind.Sequential)]
    public struct CursorInfo
    {
        public int cbSize;
        public int flags;
        public nint hCursor;
        public POINT ptScreenPos;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        public InputType type;
        public InputUnion U;
        public static int Size
        {
            get { return Marshal.SizeOf(typeof(INPUT)); }
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct InputEx
    {
        public InputType type;
        public InputUnionEx U;
        public static int Size
        {
            get { return Marshal.SizeOf(typeof(InputEx)); }
        }
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct InputUnion
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;
        [FieldOffset(0)]
        public KEYBDINPUT ki;
        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct InputUnionEx
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;
        [FieldOffset(0)]
        public KeybdInputEx ki;
        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public int mouseData;
        public MOUSEEVENTF dwFlags;
        public uint time;
        public nuint dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public VirtualKey wVk;
        public ScanCodeShort wScan;
        public KEYEVENTF dwFlags;
        public int time;
        public nuint dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct KeybdInputEx
    {
        public ushort wVk;
        public ushort wScan;
        public KEYEVENTF dwFlags;
        public int time;
        public nuint dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }
    #endregion

    [StructLayout(LayoutKind.Sequential)]
    public struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }
    [DllImport("user32.dll")]
    public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);


    public const int DESKTOPVERTRES = 117;
    public const int DESKTOPHORZRES = 118;
    public const int SM_CXSCREEN = 0;
    public const int SM_CYSCREEN = 1;
    public const int SM_REMOTESESSION = 0x1000;

    [DllImport("gdi32.dll", EntryPoint = "GetDeviceCaps", SetLastError = true)]
    public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
    public static extern int GetSystemMetrics(int mVal);

    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int GetWindowTextLength(IntPtr hWnd);
    [DllImport("user32.dll")]
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
    [DllImport("user32.dll")]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

    [DllImport("user32.dll")]
    public static extern bool IsWindowVisible(IntPtr hWnd);


    #region DLL Imports
    [DllImport("user32.dll")]
    public static extern bool GetCursorInfo(out CursorInfo pci);
    [DllImport("user32.dll", SetLastError = false)]
    public static extern nint GetDesktopWindow();

    [DllImport("user32.dll")]
    public static extern nint GetCursor();

    [DllImport("user32.dll")]
    public static extern nint CopyIcon(nint hIcon);

    [DllImport("user32.dll")]
    public static extern bool DrawIcon(nint hdc, int x, int y, nint hIcon);

    [DllImport("user32.dll")]
    public static extern bool GetIconInfo(nint hIcon, out ICONINFO piconinfo);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool DrawIconEx(IntPtr hdc, int xLeft, int yTop, IntPtr hIcon, int cxWidth, int cyHeight, int istepIfAniCur, IntPtr hbrFlickerFreeDraw, int diFlags);


    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern void Mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, nuint dwExtraInfo);

    [DllImport("user32.dll")]
    public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
    [DllImport("user32.dll")]
    public static extern uint MapVirtualKey(uint uCode, uint uMapType);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetCursorPos(out System.Drawing.Point lpPoint);
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetCursorPos(int x, int y);

    [DllImport("user32.dll")]
    public static extern nint SetCursor(nint hcursor);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern nint LoadImage(nint hinst, string lpszName, uint uType,
                                    int cxDesired, int cyDesired, uint fuLoad);

    [DllImport("user32.dll")]
    public static extern nint CreateCursor(nint hInst, int xHotSpot, int yHotSpot,
                                        int nWidth, int nHeight, byte[] pvANDPlane, byte[] pvXORPlane);

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool PrintWindow(nint hwnd, nint hDC, uint nFlags);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool SwitchDesktop(nint hDesktop);

    public delegate bool EnumDesktopsDelegate(string desktop, nint lParam);

    [DllImport("user32.dll")]
    public static extern bool EnumDesktopsA(nint hwinsta, EnumDesktopsDelegate lpEnumFunc, nint lParam);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern nint OpenInputDesktop(uint dwFlags, bool fInherit, ACCESS_MASK dwDesiredAccess);

    public delegate bool EnumWindowStationsDelegate(string windowsStation, nint lParam);

    [DllImport("user32.dll")]
    public static extern bool EnumWindowStations(EnumWindowStationsDelegate lpEnumFunc, nint lParam);

    [DllImport("user32.dll")]
    public static extern nint GetShellWindow();

    public sealed class SafeWindowStationHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        public SafeWindowStationHandle()
            : base(true)
        {
        }

        protected override bool ReleaseHandle()
        {
            return CloseWindowStation(handle);

        }
    }

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern bool CloseWindowStation(nint hWinsta);

    [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern SafeWindowStationHandle OpenWindowStation([MarshalAs(UnmanagedType.LPTStr)] string lpszWinSta, [MarshalAs(UnmanagedType.Bool)] bool fInherit, ACCESS_MASK dwDesiredAccess);

    [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern nint OpenWindowStationW([MarshalAs(UnmanagedType.LPTStr)] string lpszWinSta, [MarshalAs(UnmanagedType.Bool)] bool fInherit, ACCESS_MASK dwDesiredAccess);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool SetProcessWindowStation(nint hWinSta);

    [DllImport("user32.dll")]
    public static extern nint GetWindowDC(nint hWnd);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumChildWindows(nint hwndParent, EnumWindowsProc lpEnumFunc, nint lParam);

    [DllImport("User32.dll")]
    public static extern int ReleaseDC(nint hWnd, nint hDC);

    [DllImport("User32.dll")]
    public static extern nint GetProcessWindowStation();

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool SetThreadDesktop(nint hDesktop);

    [DllImport("user32.dll")]
    public static extern nint OpenDesktop(string lpszDesktop, uint dwFlags, bool fInherit, ACCESS_MASK dwDesiredAccess);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool CloseDesktop(nint hDesktop);

    public delegate bool EnumDesktopWindowsDelegate(nint hWnd, int lParam);

    [DllImport("user32.dll")]
    public static extern bool EnumDesktopWindows(nint hDesktop, EnumDesktopWindowsDelegate lpfn, nint lParam);

    [DllImport("user32.dll")]
    public static extern nint GetDC(nint hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern nint SetActiveWindow(nint hWnd);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetForegroundWindow(nint hWnd);

    [DllImport("user32.dll")]
    public static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
    [DllImport("user32.dll")]
    public static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] InputEx[] pInputs, int cbSize);

    [DllImport("user32.dll", SetLastError = false)]
    public static extern nuint GetMessageExtraInfo();
    [DllImport("sas.dll")]
    public static extern void SendSAS(bool asUser);
    [DllImport("user32.dll")]
    public static extern bool OpenClipboard(nint hWnd);
    [DllImport("user32.dll")]
    public static extern bool EmptyClipboard();
    [DllImport("user32.dll")]
    public static extern bool CloseClipboard();
    [DllImport("user32.dll")]
    public static extern nint SetClipboardData(int Format, nint hMem);

    [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
    public static extern bool ShowWindow(nint hWnd, int nCmdShow);
    /* 
*  SystemParametersInfo(
*      SPI_SETDESKWALLPAPER, 0, "filename.bmp", 
*      SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
*/

    public const int SPI_SETSCREENSAVEACTIVE = 17;
    public const int SPI_SETLOCKSCREENSAVER = 175;
    public const int SPI_GETSCREENSAVEACTIVE = 16;
    public const int SPI_GETLOCKSCREENSAVER = 174;
    public const int SPI_SETFLIGHTMODE = 0x0124;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int SystemParametersInfo(
      int uAction, int uParam, string lpvParam, int fuWinIni);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SystemParametersInfo(int uAction, int uParam, IntPtr lpvParam, int fuWinIni);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SystemParametersInfo(int uAction, int uParam, ref int lpvParam, int fuWinIni);


    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool LockWorkStation();

    [DllImport("user32.dll")]
    public static extern short VkKeyScan(char ch);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern short VkKeyScanEx(char ch, nint dwhkl);

    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

    [DllImport("user32.dll", EntryPoint = "BlockInput")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool BlockInput([MarshalAs(UnmanagedType.Bool)] bool fBlockIt);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int MessageBox(nint hWnd, string text, string caption, long type);

    [DllImport("USER32.dll")]
    public static extern short GetKeyState(VirtualKey nVirtKey);

    [DllImport("user32.dll")]
    public static extern uint MapVirtualKeyEx(uint uCode, VkMapType uMapType, nint dwhkl);

    [DllImport("user32.dll")]
    public static extern nint GetKeyboardLayout(uint threadId = 0);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool GetUserObjectInformationW(nint hObj, int nIndex,
         [Out] byte[] pvInfo, uint nLength, out uint lpnLengthNeeded);
    #endregion

}
